# Flask/SQLAlchemy 统一配置文件，支持多环境切换
# 环境相关参数（如 DEBUG/FLASK_ENV）由各配置类控制，.env 仅保留敏感和动态配置项
import os

class BaseConfig:
    SECRET_KEY = os.getenv('SECRET_KEY', 'your-secret-key-here')
    SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URL', 'sqlite:///instance/app.db')
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    JWT_SECRET_KEY = os.getenv('JWT_SECRET_KEY', SECRET_KEY)
    SQLALCHEMY_MIGRATE_REPO = os.getenv('SQLALCHEMY_MIGRATE_REPO', 'migrations')
    # 媒体文件统一配置（所有图片统一走 /media/<category>/<filename>）
    PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
    MEDIA_ROOT = os.getenv('MEDIA_ROOT', os.path.join(PROJECT_ROOT, 'media'))
    MEDIA_URL = os.getenv('MEDIA_URL', '/media')  # 统一相对URL前缀
    MEDIA_ALLOWED_IMAGE_EXT = {'png', 'jpg', 'jpeg', 'gif', 'webp'}
    MEDIA_DEFAULT_CATEGORIES = ['interventions', 'communication', 'avatars', 'social']
    # 可扩展：验证码服务、邮件服务、第三方API等
    # 基础连接池健壮性配置（开发/测试环境防止间歇性断开）
    SQLALCHEMY_ENGINE_OPTIONS = {
        'pool_pre_ping': True,
        'pool_recycle': 1800,
        'pool_size': 5,
        'max_overflow': 10,
        'pool_timeout': 5,
        # 放宽连接建立超时时间，减少偶发轻微延迟被误判为连接失败
        'connect_args': {'connect_timeout': 8}
    }

class DevelopmentConfig(BaseConfig):
    DEBUG = True
    FLASK_ENV = 'development'
    FLASK_APP = 'app.py'

class TestingConfig(BaseConfig):
    TESTING = True
    DEBUG = True
    FLASK_ENV = 'testing'
    FLASK_APP = 'app.py'
    # 使用绝对路径的 sqlite 测试库，避免出现 instance/instance 叠加路径解析问题
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(BaseConfig.PROJECT_ROOT, 'test.db')
    # 覆盖掉连接池的 MySQL 专用 connect_timeout 参数，避免 sqlite 抛出无效关键字
    from sqlalchemy.pool import StaticPool  # noqa: E402
    SQLALCHEMY_ENGINE_OPTIONS = {
        'pool_pre_ping': False,  # 内存/单文件测试库不需要 pre_ping
        'poolclass': StaticPool,
        'connect_args': {'check_same_thread': False}
    }

class ProductionConfig(BaseConfig):
    DEBUG = False
    FLASK_ENV = 'production'
    FLASK_APP = 'app.py'
    # 生产环境数据库、密钥等应通过环境变量单独配置

config = {
    'development': DevelopmentConfig,
    'testing': TestingConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig
}
